#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <memory.h>
#include <fcntl.h>

/**
 * 创建无名管道：无名管道只能在有血缘关系的进程之间起作用。
 * @return
 */
//int main() {
//    int fd[2];
//    int ret = -1;
//    ret = pipe(fd);
//    if(-1 == ret){
//        perror("pipe");
//        return 1;
//    }
//    // fd0用于读，fd1用于写
//    printf("fd[0]: %d,fd[1]:%d\n",fd[0],fd[1]);
//    //                                  管道缓冲区的大小
//    printf("pipe size : %ld\n", fpathconf(fd[0],_PC_PIPE_BUF));
//    //关闭文件描述符
//    close(fd[0]);
//    close(fd[1]);
//    return 0;
//}

/**
 * 无名管道只能在有血缘关系的进程之间起作用。
 * @return
 */
//int main() {
//    int fd[2];
//    int ret = -1;
//    pid_t pid = -1;
//    char buffer[64];
//    //创建管道
//    ret = pipe(fd);
//    if(-1 == ret){
//        perror("pipe");
//        return 1;
//    }
//    //创建进程
//    pid = fork();
//    if(-1 == pid){
//        perror("fork");
//        return 1;
//    }
//    // 子进程 会阻塞，等待父进程写数据
//    if(0 == pid){
//        // 子进程关闭写
//        close(fd[1]);
//        memset(buffer,0,64);
//        ret = read(fd[0],buffer,64);
//        if(ret < 0){
//            perror("read");
//            exit(-1);
//        }
//        printf("child get %s\n",buffer);
//        // 子进程读取完毕 关闭读
//        close(fd[0]);
//        exit(0);
//    }
//
//    // 父进程
//    // 父进程关闭读
//    close(fd[0]);
//    ret = write(fd[1],"hellozheheheh",13);
//    if(ret < 0){
//        perror("write");
//        return 1;
//    }
//    printf("parent write end\n");
//    // 父进程写结束 关闭写
//    close(fd[1]);
//    return 0;
//}

/**
 * 管道设置为非阻塞
 * @return
 */
//int main() {
//    int fd[2];
//    int ret = -1;
//    pid_t pid = -1;
//    char buffer[64];
//    //创建管道
//    ret = pipe(fd);
//    if(-1 == ret){
//        perror("pipe");
//        return 1;
//    }
//    //创建进程
//    pid = fork();
//    if(-1 == pid){
//        perror("fork");
//        return 1;
//    }
//    // 子进程 会阻塞，等待父进程写数据
//    if(0 == pid){
//        // 子进程关闭写
//        close(fd[1]);
//        memset(buffer,0,64);
//        printf("child reading...\n");
//
//        // 设置读端非阻塞
//        ret = fcntl(fd[0],F_GETFL);
//        ret |= O_NONBLOCK;
//        fcntl(fd[0],F_SETFL,ret);
//
//        ret = read(fd[0],buffer,64);
//        if(ret < 0){
//            perror("read");
//            exit(-1);
//        }
//        printf("child get %s\n",buffer);
//        // 子进程读取完毕 关闭读
//        close(fd[0]);
//        exit(0);
//    }
//
//    // 父进程
//    // 父进程关闭读
//    close(fd[0]);
//    sleep(3);
//    ret = write(fd[1],"hellozheheheh",13);
//    if(ret < 0){
//        perror("write");
//        return 1;
//    }
//    printf("parent write end\n");
//    // 父进程写结束 关闭写
//    close(fd[1]);
//    return 0;
//}
